<html>
<head>
<title>CpcPaChi - Version 0.06</title>
<style type="text/css">
span {
	font-family: 'Courier New';
	font-size: 10pt;
	color: #000000;
}
.sc0 {
	color: #808080;
}
.sc3 {
	color: #008080;
}
.sc4 {
	color: #FF8000;
}
.sc5 {
	font-weight: bold;
	color: #0000FF;
}
.sc7 {
	color: #808080;
}
.sc9 {
	color: #804000;
}
.sc10 {
	font-weight: bold;
	color: #000080;
}
.sc11 {
}
</style>
</head>
<body>
<h2>Un compilador sencillo paso a paso (6 - Nuevas &oacute;rdenes)</h2>

<p align="right">(Volver al <a href="doc.html">&iacute;ndice</a>) </p>

<p>Sigamos ampliando nuestro compilador elemental. Nos queda mucho por hacer. Algunas cosas ser&aacute;n relativamente trabajosas, como declarar y usar variables, o m&aacute;s todav&iacute;a cuando queramos crear procedimientos, pero alg&uacute;n otro detalle es sencillo, como seguir a&ntilde;adiendo nuevas &oacute;rdenes simples.</p>

<p>Comenzaremos por ah&iacute;: vamos a a&ntilde;adir tres &oacute;rdenes nuevas, que permitan cambiar el modo de pantalla, el color del texto y el color de fondo.</p>

<ul>
  <li>La orden de cambiar un modo de pantalla ser&aacute; "CpcMode", que recibir&aacute; un &uacute;nico par&aacute;metro: el n&uacute;mero de modo (0 para 20 columnas y 16 colores, 1 para 40 columnas y 4 colores, 2 para 80 columnas y 2 colores). Le pondremos el prefijo "Cpc" por eso de que es una orden "casi exclusiva de los CPC", mientras que las anteriores (cls, locate, writechar) tendr&iacute;an  sentido en casi cualquier sistema inform&aacute;tico.</li>

  <li>Las &oacute;rdenes de cambiar color, como tambi&eacute;n existir&aacute;n para casi cualquier sistema, no tendr&aacute;n el prefijo "cpc", y seguir&aacute;n la nomenclatura que se usaba en el Basic de estos equipos: PEN para cambiar el color de escritura (pluma) y PAPER para el color de fondo (papel).</li>
</ul>

<p>As&iacute;, al generador de c&oacute;digo (uPachiG) bastar&iacute;a con a&ntilde;adirle las correspondientes llamadas a rutinas del firmware:</p>

<pre><code>
(* Generar codigo para CPCMODE *)
procedure genCPCMODE(modo: byte);
begin
  writeln( ficheroDestino, lineaActual,' DATA 3E,',
    hexStr(modo,2), ': '' LD A, ',modo );
  lineaActual := lineaActual + 10;
  writeln( ficheroDestino, lineaActual,' DATA CD,0E,BC: '' CALL &BC0E - SET MODE' );
  lineaActual := lineaActual + 10;
  longitudTotal := longitudTotal + 5;
end;

(* Generar codigo para PAPER *)
procedure genPAPER(color: byte);
begin
  writeln( ficheroDestino, lineaActual,' DATA 3E,',
    hexStr(color,2), ': '' LD A, ', color);
  lineaActual := lineaActual + 10;
  writeln( ficheroDestino, lineaActual,' DATA CD,96,BB: '' CALL &BB96 - SET PAPER' );
  lineaActual := lineaActual + 10;
  longitudTotal := longitudTotal + 5;
end;

(* Generar codigo para PEN *)
procedure genPEN(color: byte);
begin
  writeln( ficheroDestino, lineaActual,' DATA 3E,',
    hexStr(color,2), ': '' LD A, ', color);
  lineaActual := lineaActual + 10;
  writeln( ficheroDestino, lineaActual,' DATA CD,90,BB: '' CALL &BB90 - SET PEN' );
  lineaActual := lineaActual + 10;
  longitudTotal := longitudTotal + 5;
end;
</code></pre>



<p>En el analizador sint&aacute;ctico, los cambios son peque&ntilde;os tambi&eacute;n. Aun as&iacute;, podemos aprovechar para hacerlo un poco m&aacute;s modular: los detalles del an&aacute;lisis no deber&iacute;an estar todos dentro  del procedimiento "analizarCualquierOrden", sino que &eacute;ste deber&iacute;a delegar en otros, as&iacute;:</p>

<pre><code>
procedure analizarCualquierOrden;
begin
  orden := upcase(obtenerIdentificador);
  if orden = 'CLS' then
    begin
    analizarCLS;
    end
  else
  if orden = 'CPCMODE' then
    begin
    analizarCPCMODE;
    end
  else

  [...]

procedure analizarCLS;
begin
  leerSimbolo(';');
  genCLS;
end;

procedure analizarCPCMODE;
begin
  leerSimbolo('(');
  val(obtenerEntero,x,codError);
  leerSimbolo(')');
  leerSimbolo(';');
  genCPCMODE(x);
end;

procedure analizarPAPER;
begin
  leerSimbolo('(');
  val(obtenerEntero,x,codError);
  leerSimbolo(')');
  leerSimbolo(';');
  genPAPER(x);
end;
</code></pre>


<p><br>Como siempre, para m&aacute;s detalles, todo el c&oacute;digo est&aacute; en la p&aacute;gina del proyecto en Google Code:<br /><br /><a href="http://code.google.com/p/cpcpachi/">http://code.google.com/p/cpcpachi/</a></p>



<p align="right">(Volver al <a href="doc.html">&iacute;ndice</a>) </p>
</body>
</html>
